// Copyright (C) 2008 Taylor L. Riché <riche@cs.utexas.edu>
//  
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software 
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//

#include "UDP_Packet.hh"

namespace pktTypes {

  int
  UDP_Packet::chksum() 
  {
    uint32_t sum = 0;
    // The following code is borrowed from the libnet project, and
    // falls under the following license:

    /*  Copyright (c) 1998 - 2004 Mike D. Schiffman
	<mike@infonexus.com>
	* All rights reserved. 
	* 
	* Redistribution and use in source and binary forms, with or without 
	* modification, are permitted provided that the following conditions 
	* are met: 
	* 1. Redistributions of source code must retain the above copyright 
	*    notice, this list of conditions and the following disclaimer. 
	* 2. Redistributions in binary form must reproduce the above copyright 
	*    notice, this list of conditions and the following disclaimer in the 
	*    documentation and/or other materials provided with the distribution. 
	* 
	* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 
	* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
	* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
	* ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 
	* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
	* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
	* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
	* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
	* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
	* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
	* SUCH DAMAGE. 
	*  
	*/
  
    // START LIBNET CODE
  
    //   struct libnet_tcp_hdr *tcph_p =
    //     (struct libnet_tcp_hdr *)(buf + ip_hl);

    udpHdr->check = 0;
    // if (this->getIPVersion == IP6VERSION)
    // {
    //   sum = libnet_in_cksum((u_int16_t *)&ip6h_p->ip_src, 32);
    // }
    // else
    // {
    sum = in_cksum((uint16_t *)&ipHdr->saddr, 8);
    //  }
    uint16_t proto = IPPROTO_UDP;
    sum += htons(proto) + htons(getTotLen() - IPv4_HSIZE);
    //  sum += proto + tcpLength;
    sum += in_cksum((u_int16_t *)udpHdr, getTotLen() - IPv4_HSIZE);
    udpHdr->check = CKSUM_CARRY(sum);

    // END LIBNET CODE
    return udpHdr->check;
  

  }
}
